Introducción

Este informe se enmarca en un proyecto de portafolio personal para la práctica de análisis e interpretación de datos usando RStudio. En este caso, se presenta un análisis exploratorio de la base de datos Gapminder, que contiene variables socio-económicas para 142 países. El ejercicio propuesto para la práctica de RStudio, consistió en solicitarle a modelos de IA (ChatGPT y Google Gemini) que me asignaran ejercicios de análisis y exploración de datos en aras de prácticar mis habilidades y proceso de aprendizaje en RStudio, es decir, sin especificar el código a ejecutar para completar las tareas propuestas. Además de esto, mediante estos mismos modelos de IA solicité retroalimentación técnica (respecto a la ejecución de las funciones y los operadores) y conceptual-interpretativa.

knitr::opts_chunk$set(echo = TRUE)
library(dplyr)
## 
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
## 
##     filter, lag
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union
library(ggplot2)
library(tidyr)
library(janitor)
## 
## Attaching package: 'janitor'
## The following objects are masked from 'package:stats':
## 
##     chisq.test, fisher.test
library(forcats)
library(tidyverse)
## ── Attaching core tidyverse packages ──────────────────────── tidyverse 2.0.0 ──
## ✔ lubridate 1.9.4     ✔ stringr   1.5.1
## ✔ purrr     1.0.4     ✔ tibble    3.3.0
## ✔ readr     2.1.5
## ── Conflicts ────────────────────────────────────────── tidyverse_conflicts() ──
## ✖ dplyr::filter() masks stats::filter()
## ✖ dplyr::lag()    masks stats::lag()
## ℹ Use the conflicted package (<http://conflicted.r-lib.org/>) to force all conflicts to become errors
library(readxl)
library(knitr)
library(gganimate)
library(gifski)

Cargar datos a analizar

library(gapminder)
data(gapminder)

Parte 1: Exploración de datos

Muestra las primeras 10 filas del conjunto gapminder.

gapminder%>%
  head(10)
## # A tibble: 10 × 6
##    country     continent  year lifeExp      pop gdpPercap
##    <fct>       <fct>     <int>   <dbl>    <int>     <dbl>
##  1 Afghanistan Asia       1952    28.8  8425333      779.
##  2 Afghanistan Asia       1957    30.3  9240934      821.
##  3 Afghanistan Asia       1962    32.0 10267083      853.
##  4 Afghanistan Asia       1967    34.0 11537966      836.
##  5 Afghanistan Asia       1972    36.1 13079460      740.
##  6 Afghanistan Asia       1977    38.4 14880372      786.
##  7 Afghanistan Asia       1982    39.9 12881816      978.
##  8 Afghanistan Asia       1987    40.8 13867957      852.
##  9 Afghanistan Asia       1992    41.7 16317921      649.
## 10 Afghanistan Asia       1997    41.8 22227415      635.

Hay 12 observaciones por cada país de la base de datos.

¿Cuántos países únicos hay en el conjunto?

# podríamos hacer un conteo para mirar qupé países tienen sólo una observación
gapminder%>%
  group_by(country)%>%
  count()
## # A tibble: 142 × 2
## # Groups:   country [142]
##    country         n
##    <fct>       <int>
##  1 Afghanistan    12
##  2 Albania        12
##  3 Algeria        12
##  4 Angola         12
##  5 Argentina      12
##  6 Australia      12
##  7 Austria        12
##  8 Bahrain        12
##  9 Bangladesh     12
## 10 Belgium        12
## # ℹ 132 more rows

Retroalimentación mediante IA:

El modelo de IA al que asigné la revisión de este ejercicio de análisis sugiere que, para precisar más el ejercicio, la función correcta es n_distinct(). Así:

n_distinct(gapminder$country)
## [1] 142

Este resultado es evidentemente más preciso que el anterior.

Promedio de expectativa de vida por continente.

gapminder%>%
  group_by(continent)%>%
  summarise(life_expc_mean=round(mean(lifeExp,na.rm=T),1))%>%
  arrange(desc(life_expc_mean))%>%
  kable(col.names = c("Continent","Life expectation (mean)"))
Continent Life expectation (mean)
Oceania 74.3
Europe 71.9
Americas 64.7
Asia 60.1
Africa 48.9

Evolución de la expectativa de vida en Colombia desde 1952 hasta 2007.

gapminder%>%
  filter(country=="Colombia",
         year>=1952&year<=2007)%>%
  group_by(year,lifeExp)%>%
  ggplot(aes(x=year,
             y=lifeExp))+
  geom_line()+
  labs(title = "Life expectation in Colombia (1952-2007)",
       x="Year",
       y="Life expectation")+
  theme_classic()+
  geom_point()+
  geom_text(aes(label = round(lifeExp,1)),vjust=-1.5)

Parte 2: Análisis de regresión

Delimitación al año 2007.

gapminder2007<-gapminder%>%
  filter(year==2007)

Regresión lineal para estimar la expectativa de vida en función del PIB per cápita

model_lifeexpc_gdppc<-lm(lifeExp~gdpPercap,data=gapminder2007)

Visualización del modelo

summary(model_lifeexpc_gdppc)
## 
## Call:
## lm(formula = lifeExp ~ gdpPercap, data = gapminder2007)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -22.828  -6.316   1.922   6.898  13.128 
## 
## Coefficients:
##              Estimate Std. Error t value Pr(>|t|)    
## (Intercept) 5.957e+01  1.010e+00   58.95   <2e-16 ***
## gdpPercap   6.371e-04  5.827e-05   10.93   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 8.899 on 140 degrees of freedom
## Multiple R-squared:  0.4606, Adjusted R-squared:  0.4567 
## F-statistic: 119.5 on 1 and 140 DF,  p-value: < 2.2e-16

Interpretación del modelo

El intercepto del modelo es de 5.957e+01, lo que representa que la expectativa de edad estimada en un país cuando el PIB per cápita es 0 o inexistente. Esto, pese a que no tiene sun sentido realista, es el punto de referencia para la operación. El coeficiente de regresión asociado al PIB per cápita es de 6.371e-04, lo cual expresa que por cada dólar adicional en el PIB per cápita, la expectativa de vida sube, en promedio, un 6.371e-04. Este resultado es estadísticamente significativo (p<0.005).

Muestra un gráfico de dispersión con la recta de regresión.

gapminder2007%>%
  ggplot(aes(x=gdpPercap,
             y=lifeExp))+
  geom_point(alpha=.6)+
  geom_smooth(method = "lm")+
  theme_classic()+
  labs(title = "Correlation between GDP per capita and life expectation (2007)",
       x="GDP per capita",
       y="Life expectation")
## `geom_smooth()` using formula = 'y ~ x'

Parte 3

#### Transforma el PIB per cápita usando logaritmo natural (log(gdpPercap)) y repite la regresión.

model_ln<-lm(lifeExp~log(gdpPercap),data=gapminder2007)

Visualización

summary(model_ln)
## 
## Call:
## lm(formula = lifeExp ~ log(gdpPercap), data = gapminder2007)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -25.947  -2.661   1.215   4.469  13.115 
## 
## Coefficients:
##                Estimate Std. Error t value Pr(>|t|)    
## (Intercept)      4.9496     3.8577   1.283    0.202    
## log(gdpPercap)   7.2028     0.4423  16.283   <2e-16 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 7.122 on 140 degrees of freedom
## Multiple R-squared:  0.6544, Adjusted R-squared:  0.652 
## F-statistic: 265.2 on 1 and 140 DF,  p-value: < 2.2e-16

Compara los resultados de la regresión con y sin transformación. ¿Cuál modelo se ajusta mejor? ¿Por qué?

Ambos modelos correlacionan las mismas variables, sin embargo, como la varible del PIB posee una escala es tan grande, transformar esta mediante el función del logaritmo natural permite el entender el modelo de manera más clara, ya que esta nos arroja la expresión en términos proporcionales, lo cual reduce la escala. Así, en este modelo, el intercepto se encuentra 0.049496, lo cual sería la expectativa de vida asociada a un país cuando el PIB per cápita es 1 dólar (no 0 porque el logaritmo es indefinido y logaritmo natural de 1 es 0). Respecto al coeficiente de correlación, este expresa que en un incremento porcentual (de 1%) en el PIB per cápita tiene un efecto positivo de 0.07292 años más en la expectativa de vida de un país. Ahora, este modelo se ajusta mejor a los datos con base en el R^2, que para este es de 0.6544 y para el anterior fue de 0.4606.

Viscualización del modelo con transformación logarítmica

gapminder2007%>%
  ggplot(aes(x=log(gdpPercap),
             y=lifeExp))+
  geom_point(alpha=.6)+
  geom_smooth(method = "lm")+
  theme_classic()+
  labs(title = "Correlation between GDP per capita and life expectation",
       x="GDP per capita (LogNat)",
       y="Life expectation")
## `geom_smooth()` using formula = 'y ~ x'

Se aprecia una relación más clara.

Parte 4: Exploración Avanzada y Comparación

Evolución temporal: expectativa de vida a lo largo del tiempo por continente

gapminder%>%
  ggplot(aes(x=gdpPercap,
                y=lifeExp,
                color=continent))+
  geom_point(alpha=.5,size=2)+
  theme_classic()+
  labs(title = "Time evolution: life expectation and GDP per capita",
       x="GDP per capita",
       y="Life expectation",
       color="Continent",
       subtitle = "Year: {frame_time}")+
  transition_time(year)+
   ease_aes('linear')

Este pertinente notar la distancia y el rezago que África presenta durante la década de 1990. Además de esto, se evidencia que, a diferencia del resto de continentes, África no presenta un crecimiento económico visual tan acelerado, tal como puede apreciarse con Europa, América y Ásia, mas sí incrementa su expectativa de vida. Lo anterior, podría dar paso a hipótesis más precisas que tomen en cuenta nuevos y diferentes factores que no sólo se limiten al PIB per cápita sino también avances médico-tecnológicos, políticas públicas de salud, mejoras infraestructurales, acceso a mejores recursos (como la calidad del agua potable), entre otros a considerar.

Comparación entre países de cada continente

Tomaremos una muestra aleatoria: un país por cada continente

# muestra aleatoria # se debe desagrupar luego sacar la muestra
gapminder%>%
  distinct(continent,country)%>%
  group_by(continent)%>%
  slice_sample(n=1)%>%
  ungroup()
## # A tibble: 5 × 2
##   continent country    
##   <fct>     <fct>      
## 1 Africa    Somalia    
## 2 Americas  Uruguay    
## 3 Asia      China      
## 4 Europe    Hungary    
## 5 Oceania   New Zealand

Delimitación para comparar

countries_comp<-gapminder%>%
  filter(country=="Somalia"|
           country=="Jamaica"|
         country=="Yemen, Rep."|
           country=="Montenegro"|
           country=="Australia")

Para poder comparar escalas con medidas tan diferentes como lo son la expectativa de vida y el PIB per cápita, procedemos a normalizar las varibales para poder conseguir una escala común. La fórmula para normalizar es x’=(x-min(x))/(max(x) - min(x)); esto es, valor normalizado (x’) es igual (=) a el valor original (x) menos el valor mínimo de la variable (min(x)) sobre (/) el valor máximo de la variable (max(x)) menos (-) el valor mínimo de la variable (min(x)).

Así, debemos crear los valores normalizados para las variables a comparar: expectativa de vida y PIB per cápita.

# creamos las nuevas variables con los valores normalizados
countries_comp<-countries_comp%>%
  mutate(norm_lifeexpc=(lifeExp-min(lifeExp))/(max(lifeExp)-min(lifeExp)),
         norm_gdppc=(gdpPercap-min(gdpPercap))/(max(gdpPercap)-min(gdpPercap)))

Procedemos a pivotear los datos, lo cual consiste, esencialmente, en transformar datos de un formato a otro. De formato ancho (wide format) a formato largo (long format) y viceversa. Este proceso se realiza para poder graficar dos variables o más en un mismo eje.

norm_countries_comp<-countries_comp%>%
  pivot_longer(cols = c(norm_lifeexpc,norm_gdppc),names_to = "metric",values_to = "norm_value")

Vizualización de la comparación con variables normalizadas

norm_countries_comp%>%
  ggplot(aes(x=year,
             y=norm_value,
             color=country,
             linetype=metric))+
  geom_line(linewidth=1.1)+
  theme_linedraw()+
  theme_linedraw()+
  labs(title="Compared evolution: life expectation and GDP per cápita in five countries (1952-2007)",
       x="Year",
       y="Normalized value",
       color="Country",
       linetype="Metric")

Véamos ahora lo mismo pero por páneles, según la pertenencia de cada país a su respectivo continente.

norm_countries_comp%>%
  ggplot(aes(x=year,
             y=norm_value,
             color = country,
             linetype = metric))+
  geom_line(size=1.2)+
  theme_linedraw()+
  facet_wrap(~continent)+
  labs(title="Compared evolution: life expectation and GDP per cápita in five countries (1952-2007)",
       x="Year",
       y="Normalized value",
       color="Country",
       linetype="Metric")
## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.